// 对axios 进行相关配置
import axios from 'axios'
import JSONBig from 'json-bigint'

// 导入store(vuex) 用于获取用户信息
import store from '@/store/index.js'

// 导入路由，使得可以执行路由跳转
import router from '@/router/index.js'

const instance = axios.create({
    // 请求公共根地址
    baseURL: 'http://ttapi.research.itcast.cn/',
    // 超大整型数字转化器
    transformResponse: [function (data) {
        try {
            // 成功：实体字符串
            // 失败：空壳字符串
            return JSONBig.parse(data)
        } catch (err) {
            return data
        }
    }]
})

// 配置【请求拦截器】
instance.interceptors.request.use(function (config) {
    // 判断token存在在做配置（vuex判断）
    if (store.state.user.token) {
        config.headers.Authorization = 'Bearer ' + store.state.user.token
    }
    return config
}, function (error) {
    return Promise.reject(error)
})

// 配置【相应拦截器】
instance.interceptors.response.use(function (response) {
    // 正常响应处理
    // 确认服务器端返回的数据：返回data、返回data.data
    try {
        return response.data.data
    } catch (error) {
        return response.data
    }
}, async function (error) {
    if (error.response.status === 401) {
        // router.push('/login')
        // return new Promise(function () {}) // 空的Promise对象，没有机会执行catch，进而不做错误提示了

        // refresh_token去营救token
        // 1. 判断refresh_token如果也没有，强制登录
        if (!store.state.user.refresh_token) {
            router.push('/login')
            // return 停止后续代码执行
            return new Promise(function () { }) // 返回空壳的对象，不要报任何错误
        }
        // 2. refresh_token存在，就携带者，发送新的axios请求，去营救token
        try {
            // axios有可能产生错误，就被catch捕捉
            const result = await axios({
                url: 'http://ttapi.research.itcast.cn/app/v1_0/authorizations',
                method: 'put',
                // 配置请求信息
                headers: {
                    // 配置refresh_token
                    Authorization: 'Bearer ' + store.state.user.refresh_token
                }
            })
            // 注意：服务器端没有返回refresh_token，还使用当前的
            store.commit('updateUser', {
                token: result.data.data.token,
                refresh_token: store.state.user.refresh_token
            })
            // 把刚刚401失败的请求再重新发送一次
            return instance(error.config)
        } catch (err) {
            // 清除无效的refresh_token
            store.commit('clearUser')
            // token不ok(token在服务器端已经失效了，2个小时时效)
            // 强制用户重新登录系统，以刷新服务器端的token时效
            router.push('/login')
            // 不要给做错误提示了
            return new Promise(function () {}) // 空的Promise对象，没有机会执行catch，进而不做错误提示了
        }

    }
    return Promise.reject(error)
})
export default instance